package org.example.backend.utils;

import cn.hutool.captcha.*;
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.captcha.generator.RandomGenerator;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.RandomUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.io.OutputStream;

/**
 * 验证码工具类
 */
@Component
public class CaptchaUtils {

    @Value("${captcha.type}")
    public String type;


    public String generateCaptcha() {
        switch (type) {
            case "number":
                return generateDigitCode();
        }
        return null;
    }
    /**
     * 生成六位纯数字验证码
     */
    public static String generateDigitCode() {
        return RandomUtil.randomNumbers(6);
    }

    /**
     * 生成数字字母混合验证码（六位）
     */
    public static String generateMixedCode() {
        return RandomUtil.randomString(6);
    }

    /**
     * 创建线段干扰的图形验证码（算术型）
     * @param width    图片宽度
     * @param height   图片高度
     * @return LineCaptcha对象（含验证码图片和答案）
     */
    public static LineCaptcha createLineCaptcha(int width, int height) {
        // 创建算术验证码（结果需计算）
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(width, height);
        captcha.setGenerator(new MathGenerator());
        captcha.createCode();
        return captcha;
    }

    /**
     * 创建圆圈干扰的图形验证码（数字字母型）
     * @param width    图片宽度
     * @param height   图片高度
     * @return CircleCaptcha对象
     */
    public static CircleCaptcha createCircleCaptcha(int width, int height) {
        CircleCaptcha captcha = new CircleCaptcha(width, height, 6, 20);
        captcha.setGenerator(new RandomGenerator("0123456789abcdefghijklmnopqrstuvwxyz", 6));
        captcha.createCode();
        return captcha;
    }

    /**
     * 输出验证码图片到流（自动关闭流）
     * @param captcha 验证码对象
     * @param out     输出流
     */
    public static void writeToStream(AbstractCaptcha captcha, OutputStream out) {
        ImgUtil.write(captcha.getImage(), "png", out);
    }

    /**
     * 验证码校验
     * @param captcha   验证码对象
     * @param userInput 用户输入
     */
    public static boolean verify(AbstractCaptcha captcha, String userInput) {
        return captcha.verify(userInput);
    }
}
